package com.cskaoyan.javase.oop1._13block._3static;
/**
 * 静态代码块
 * 语法: static{}
 * 定义位置: 类体中的成员位置
 * 作用: 在类加载过程中,用于给静态成员变量赋值.可以把它当成是一个类加载过程中,自动调用的静态成员方法.
 * 总结一下类加载过程中,给静态成员变量赋值的方式:
 *      1.默认初始化,具有默认值
 *      2.显式赋值
 *      3.静态代码块赋值
 * 以上过程,默认初始化最先进行,显式赋值和静态代码块赋值会按照代码的书写顺序从上到下执行
 * 静态代码块在实际开发中，并不常见。根据它的一些特点，可以总结一下它的使用场景
 * 复杂的静态成员变量的赋值
 * （最经典的）JavaEE中加载JDBC驱动
 *
 * 如果有一段代码从始至终，只运行一次而且必须运行一次，可以写到静态代码块
 * 比如一些初始化工作
 * 非常典型的就是System.out对象的初始化
 *
 * @since 11:07
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*
            System是一个类名,System.out是一个静态成员变量
            并且System.out能够调用方法println
            所以System.out实际上是一个对象
          */

        System.out.println(Person.address);
    }
}
class Person{

    // 建议将静态代码块写在变量声明和显式赋值的下面，避免造成一些不必要的麻烦
    static String address = "河南";
    static {
        address = "湖北";
    }

}